﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Mantenimiento.Models;
using PagedList;

namespace Mantenimiento.Controllers
{
    public class PlantillaController : Controller
    {
        private mantenimientoEntities db = new mantenimientoEntities();

        int pageSize = 5;
        //
        // GET: /Plantilla/

        public ActionResult ListActividad()
         {
             IEnumerable<PLANTILLA_DETALLE> lstdetalle = (IEnumerable<PLANTILLA_DETALLE>)Session["detalle"];
             foreach (var item in lstdetalle) 
             {
                 item.ACTIVIDAD = db.ACTIVIDAD.FirstOrDefault(x => x.ACTIVIDAD_ID == item.ACTIVIDAD_ID);
             }

             return View(lstdetalle);
         }

        public ViewResult Index(string sortOrder, string buscaNombrePlantilla, string currentFilter, int? page)
        {
            ViewBag.CurrentSort = sortOrder;
            ViewBag.BuscaNombrePlantilla = buscaNombrePlantilla;

            if (Request.HttpMethod == "GET")
            {
                buscaNombrePlantilla = currentFilter;
            }
            else
            {
                page = 1;
            }

            ViewBag.CurrentFilter = buscaNombrePlantilla;

            var list = db.PLANTILLA.ToList();

            if (!String.IsNullOrEmpty(buscaNombrePlantilla))
            {
                list = list.Where(s => s.DESCRIPCION.ToUpper().Contains(buscaNombrePlantilla.ToUpper())).ToList();
            }

            string evalSort = (ViewBag.CurrentSort == null ? "" : ViewBag.CurrentSort.ToString());
            switch (evalSort)
            {
                case "DESCRIPCION":
                    list = list.OrderBy(p => p.DESCRIPCION).ToList();
                    break;
                default:
                    list = list.OrderBy(p => p.PLANTILLA_ID).ToList();
                    break;
            }                

            int pageIndex = page ?? 1;

            return View(list.ToPagedList(pageIndex, pageSize));
        }

        //
        // GET: /Plantilla/Details/5

        public ActionResult Details(int id = 0)
        {
            Session.Remove("detalle");
            MaxValue = 100000;

            PLANTILLA plantilla = db.PLANTILLA.FirstOrDefault(p => p.PLANTILLA_ID == id);
            if (plantilla == null)
            {
                return HttpNotFound();
            }
            Session["detalle"] = plantilla.PLANTILLA_DETALLE.AsEnumerable();
            plantilla.PlantillaDetalle = plantilla.PLANTILLA_DETALLE.AsEnumerable();
            return View(plantilla);
        }

        //
        // GET: /Plantilla/Create

        public ActionResult Create()
        {
            Session["detalle"] = null;
            MaxValue = 100000;
            PLANTILLA plantilla = new PLANTILLA();
            plantilla.PlantillaDetalle = new List<PLANTILLA_DETALLE>();
            return View(plantilla);
        }

        //
        // POST: /Plantilla/Create

        [HttpPost]
        public ActionResult Create(PLANTILLA plantilla)
        {
            if (ModelState.IsValid)
            {
                plantilla.PLANTILLA_ID = db.PLANTILLA.Select(p => p.PLANTILLA_ID).Max() + 1;
                db.PLANTILLA.Add(plantilla);
                db.SaveChanges();

                IEnumerable<PLANTILLA_DETALLE> lstdetalle = (IEnumerable<PLANTILLA_DETALLE>)Session["detalle"];
                foreach (var item in lstdetalle)
                {
                    item.PLANTILLA_ID = plantilla.PLANTILLA_ID;
                    item.PLATILLA_DETALLE_ID = db.PLANTILLA_DETALLE.Select(p => p.PLATILLA_DETALLE_ID).Max() + 1;
                    db.PLANTILLA_DETALLE.Add(item);
                    db.SaveChanges();
                }

                //create record for details, finally remove the variable
                Session["detalle"] = null;

                return RedirectToAction("Index");
            }

            return View(plantilla);
        }

        //
        // GET: /Plantilla/Edit/5

        public ActionResult Edit(int id = 0)
        {
            Session.Remove("detalle");
            MaxValue = 100000;
            
            PLANTILLA plantilla = db.PLANTILLA.FirstOrDefault(p => p.PLANTILLA_ID == id);
            if (plantilla == null)
            {
                return HttpNotFound();
            }
            Session["detalle"] = plantilla.PLANTILLA_DETALLE.AsEnumerable();
            plantilla.PlantillaDetalle = plantilla.PLANTILLA_DETALLE.AsEnumerable();
            return View(plantilla);
        }

        //
        // POST: /Plantilla/Edit/5

        [HttpPost]
        public ActionResult Edit(PLANTILLA plantilla)
        {
            //if (ModelState.IsValid)
            //{
            //    db.Entry(plantilla).State = EntityState.Modified;
            //    db.SaveChanges();
            //    return RedirectToAction("Index");
            //}
            //return View(plantilla);

            if (ModelState.IsValid)
            {
                db.Entry(plantilla).State = EntityState.Modified;
                db.SaveChanges();

                IEnumerable<PLANTILLA_DETALLE> lstdetalle = (IEnumerable<PLANTILLA_DETALLE>)Session["detalle"];
                foreach (var item in lstdetalle)
                {
                    PLANTILLA_DETALLE oldDetalle = db.PLANTILLA_DETALLE.FirstOrDefault(p => p.PLATILLA_DETALLE_ID == item.PLATILLA_DETALLE_ID);

                    if (oldDetalle == null)
                    {
                        oldDetalle = new PLANTILLA_DETALLE();
                        oldDetalle.PLANTILLA_ID = plantilla.PLANTILLA_ID;
                        oldDetalle.PLATILLA_DETALLE_ID = db.PLANTILLA_DETALLE.Select(p => p.PLATILLA_DETALLE_ID).Max() + 1;
                        oldDetalle.UNIDAD_FRECUENCIA = item.UNIDAD_FRECUENCIA;
                        oldDetalle.PRIORIDAD = item.PRIORIDAD;
                        oldDetalle.FRECUENCIA = item.FRECUENCIA;
                        oldDetalle.ACTIVIDAD_ID = item.ACTIVIDAD_ID;
                        db.PLANTILLA_DETALLE.Add(oldDetalle);
                    }
                    else 
                    {
                        oldDetalle.UNIDAD_FRECUENCIA = item.UNIDAD_FRECUENCIA;
                        oldDetalle.PRIORIDAD = item.PRIORIDAD;
                        oldDetalle.FRECUENCIA = item.FRECUENCIA;
                        oldDetalle.ACTIVIDAD_ID = item.ACTIVIDAD_ID;
                    }

                    db.SaveChanges();                    
                }

                //create record for details, finally remove the variable
                Session["detalle"] = null;

                return RedirectToAction("Index");
            }

            return View(plantilla);
        }

        //
        // GET: /Plantilla/Delete/5

        public ActionResult Delete(int id = 0)
        {
            //PLANTILLA plantilla = db.PLANTILLA.Find(id);
            //if (plantilla == null)
            //{
            //    return HttpNotFound();
            //}
            //return View(plantilla);

            PLANTILLA plantilla = db.PLANTILLA.Find(id);
            List<PLANTILLA_DETALLE> lstPlantillaDetalle = db.PLANTILLA_DETALLE.Where(p => p.PLANTILLA_ID == id).ToList();
            foreach(var item in lstPlantillaDetalle)
            {
                db.PLANTILLA_DETALLE.Remove(item);
            }
            db.PLANTILLA.Remove(plantilla);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        //
        // POST: /Plantilla/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            PLANTILLA plantilla = db.PLANTILLA.Find(id);
            db.PLANTILLA.Remove(plantilla);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        private List<SelectListItem> fillPlantillaItems()
        {
            var actividades = db.ACTIVIDAD.Select(c => new { c.DESCRIPCION, c.ACTIVIDAD_ID });

            List<SelectListItem> lst = new List<SelectListItem>();
            foreach (var item in actividades)
            {
                lst.Add(new SelectListItem() { Text = item.DESCRIPCION, Value = item.ACTIVIDAD_ID.ToString() });
            }

            return lst;
        }

        private List<SelectListItem> fillUnidadFrecuenciaItems()
        {
            var unidadfrecuencia = new List<SelectListItem>();
            unidadfrecuencia.Add(new SelectListItem() { Value = "2", Text = "Semanas" });
            unidadfrecuencia.Add(new SelectListItem() { Value = "3", Text = "Meses" });
            unidadfrecuencia.Add(new SelectListItem() { Value = "4", Text = "Años" });
            return unidadfrecuencia;
        }            

        //PlantillaDetalle methods
        [HttpGet]
        public ActionResult AddEditActividadTest(int ACTIVIDAD_ID, int FRECUENCIA, int UNIDAD_FRECUENCIA, string PRIORIDAD, string cmd)
        {
            return View("AddEditActividad", new PLANTILLA_DETALLE());
        }

        [HttpGet]
        public ActionResult AddEditActividad(int? id, int? idAct)
        {
            Random x = new Random();
            if (Request.IsAjaxRequest())
            {
                if (id.HasValue && idAct.HasValue)
                {
                    ViewBag.IsUpdate = true;
                    PLANTILLA_DETALLE detalle = null;

                    if (id != 0)
                    {
                        detalle = db.PLANTILLA_DETALLE.Where(m => m.PLANTILLA_ID == id && m.ACTIVIDAD_ID == idAct).FirstOrDefault();                        
                    }
                    else 
                    {
                        IEnumerable<PLANTILLA_DETALLE> lstdetalle = (IEnumerable<PLANTILLA_DETALLE>)Session["detalle"];
                        detalle = lstdetalle.FirstOrDefault(p => p.ACTIVIDAD_ID == idAct.Value && p.PLANTILLA_ID == id.Value); 
                    }

                    detalle.Actividades = fillPlantillaItems();
                    detalle.Unidad_Frecuencias = fillUnidadFrecuenciaItems();
                    
                    return PartialView("AddEditActividad", detalle);
                }

                MaxValue = MaxValue + 1;

                PLANTILLA_DETALLE newDetalle = new PLANTILLA_DETALLE();
                newDetalle.PLANTILLA_ID = id.Value;
                newDetalle.PLATILLA_DETALLE_ID = MaxValue;
                newDetalle.PRIORIDAD = "1";
                newDetalle.Actividades = fillPlantillaItems();
                newDetalle.Unidad_Frecuencias = fillUnidadFrecuenciaItems();

                ViewBag.IsUpdate = false;
                return PartialView("AddEditActividad", newDetalle);
            }
            else
            {
                if (id != null && idAct != null)
                {
                    ViewBag.IsUpdate = true;
                    PLANTILLA_DETALLE detalle = db.PLANTILLA_DETALLE.Where(m => m.PLANTILLA_ID == id && m.ACTIVIDAD_ID == idAct).FirstOrDefault();
                    detalle.Actividades = fillPlantillaItems();
                    detalle.Unidad_Frecuencias = fillUnidadFrecuenciaItems();
                    return PartialView("AddEditActividad", detalle);
                }

                MaxValue = MaxValue + 1;

                PLANTILLA_DETALLE newDetalle = new PLANTILLA_DETALLE();
                newDetalle.PLANTILLA_ID = id.Value;                
                newDetalle.PLATILLA_DETALLE_ID = MaxValue;
                newDetalle.PRIORIDAD = "1";
                newDetalle.Actividades = fillPlantillaItems();
                newDetalle.Unidad_Frecuencias = fillUnidadFrecuenciaItems();

                ViewBag.IsUpdate = false;
                return View("AddEditActividad", newDetalle);
            }
        }

        static int MaxValue = 100000;
        //static List<PLANTILLA_DETALLE> detalle = new List<PLANTILLA_DETALLE>();
        
        [HttpPost]
        public ActionResult AddEditActividad(int? PLATILLA_DETALLE_ID, int? PLANTILLA_ID, int ACTIVIDAD_ID, int FRECUENCIA, int UNIDAD_FRECUENCIA, string PRIORIDAD, string cmd)
        {
            PLANTILLA_DETALLE updDetalle = null;

            if (ModelState.IsValid)
            {
                if (cmd == "Aceptar")
                {
                    try
                    {
                        updDetalle = new PLANTILLA_DETALLE();
                        //updDetalle.PLANTILLA_ID = PLANTILLA_ID.Value;
                        MaxValue = MaxValue+1;
                        updDetalle.PLATILLA_DETALLE_ID = MaxValue;
                        updDetalle.UNIDAD_FRECUENCIA = UNIDAD_FRECUENCIA.ToString();
                        updDetalle.PRIORIDAD = PRIORIDAD;
                        updDetalle.FRECUENCIA = FRECUENCIA;
                        updDetalle.ACTIVIDAD_ID = ACTIVIDAD_ID;
                        updDetalle.Actividades = fillPlantillaItems();
                        updDetalle.Unidad_Frecuencias = fillUnidadFrecuenciaItems();
                        //detalle.Add(updDetalle);

                        IEnumerable<PLANTILLA_DETALLE> detalle = (IEnumerable<PLANTILLA_DETALLE>)Session["detalle"];
                        List<PLANTILLA_DETALLE> lstDetalle = new List<PLANTILLA_DETALLE>();

                        if (detalle != null)
                        {
                            lstDetalle = detalle.ToList();                        
                        }

                        lstDetalle.Add(updDetalle);
                        Session["detalle"] = lstDetalle.AsEnumerable();

                        //db.PLANTILLA_DETALLE.Add(updDetalle);
                        //db.SaveChanges();
                        return RedirectToAction("ListActividad");
                    }
                    catch { }
                }
                else
                {
                    try
                    {
                        updDetalle = db.PLANTILLA_DETALLE.FirstOrDefault(m => m.PLATILLA_DETALLE_ID == PLATILLA_DETALLE_ID.Value);
                        if (updDetalle != null)
                        {
                            updDetalle.UNIDAD_FRECUENCIA = UNIDAD_FRECUENCIA.ToString();
                            updDetalle.PRIORIDAD = PRIORIDAD;
                            updDetalle.FRECUENCIA = FRECUENCIA;
                            updDetalle.ACTIVIDAD_ID = ACTIVIDAD_ID;
                            updDetalle.Actividades = fillPlantillaItems();
                            updDetalle.Unidad_Frecuencias = fillUnidadFrecuenciaItems();
                            db.SaveChanges();

                            IEnumerable<PLANTILLA_DETALLE> detalle = (IEnumerable<PLANTILLA_DETALLE>)Session["detalle"];
                            var lstDetalle = detalle.ToList();
                            var oldItem = lstDetalle.FirstOrDefault(m => m.PLATILLA_DETALLE_ID == PLATILLA_DETALLE_ID.Value);
                            lstDetalle.Add(updDetalle);
                            lstDetalle.Remove(oldItem);

                            Session["detalle"] = lstDetalle.AsEnumerable();
                        }
                        //return RedirectToAction("Index");

                        return RedirectToAction("ListActividad");
                    }
                    catch { }
                }
            }

            if (Request.IsAjaxRequest())
            {
                return PartialView("AddEditActividad", updDetalle);
            }
            else
            {
                return View("AddEditActividad", updDetalle);
            }
        }

        [HttpGet]
        public ActionResult DeleteActividad(int id)
        {
            PLANTILLA_DETALLE detalle_ent = db.PLANTILLA_DETALLE.Where(m => m.PLATILLA_DETALLE_ID == id).FirstOrDefault();
            if (detalle_ent != null)
            {
                try
                {
                    db.PLANTILLA_DETALLE.Remove(detalle_ent);
                    db.SaveChanges();
                }
                catch { }
            }            

            IEnumerable<PLANTILLA_DETALLE> detalle = (IEnumerable<PLANTILLA_DETALLE>)Session["detalle"];
            var lstDetalle = detalle.ToList();
            var itemToRemove = lstDetalle.FirstOrDefault(m => m.PLATILLA_DETALLE_ID == id);
            lstDetalle.Remove(itemToRemove);
            Session["detalle"] = lstDetalle.AsEnumerable();                

            return RedirectToAction("ListActividad");
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}